import database from './indexDB.js'
class Msghandler {
  isConnectDatabase = false // 是否连接
  timer = null // 识别两次消息为两个摄像头信息的定时器
  preMsgCache = null // 消息缓存
  constructor() {
    this.initDatabase()
  }
  //   初始化数据库
  initDatabase() {
    database.connect() // 连接数据库
  }
  //   保存消息
  async saveMsg(msg) {
    // 拷贝数据，防止数据污染
    msg = JSON.parse(JSON.stringify(msg))
    // 分析数据，并存到本地
    this.analyseMsg(msg)
  }
  //   分析消息
  analyseMsg(msg) {
    if (!database.isConnected) return console.log('数据库未连接')
    const Configs = {
      isJudgeDeviceCode: localStorage.getItem('isJudgeDeviceCode') || '1', //控制是否根据设备不同才记录消息
      judgeInterval: Number(localStorage.getItem('judgeInterval') || 1.5) || 1.5, //设置两次消息判断为一组消息的时间间隔
      maxDiffCount: Number(localStorage.getItem('maxDiffCount') || 2) || 2 //设置最大不同位数
    }
    if (msg.params) {
      // 存在上次消息缓存，开启判断车牌是否相同
      // 根据时间间隔1.5s内，判断为一组车牌
      if (this.timer && this.preMsgCache) {
        let currentMsgInfo = msg.params
        let preMsgInfo = this.preMsgCache.params
        // 如果为相同设备，不处理，(1为判断，2为不判断)
        if (Configs.isJudgeDeviceCode == '1' && currentMsgInfo.deviceCode == preMsgInfo.deviceCode)
          return
        let isSame = currentMsgInfo.plateNumber == preMsgInfo.plateNumber
        let sheetObj = database.getObjectStore('message')
        // 判断车牌号是否相同
        let timestamp = Date.now()
        let tempObj = {
          composition1: preMsgInfo.plateNumber,
          composition2: currentMsgInfo.plateNumber,
          timestamp,
          isSame: Number(isSame)
          // plateDatabase1: preMsgInfo.plateImage || '无',
          // plateDatabase2: currentMsgInfo.plateImage || '无'
        }
        // 只有不相同的数据才存储
        if (!isSame) {
          // 添加本地数据库该组数据
          sheetObj.add(tempObj)
        }

        if (!isSame) {
          let count = 0
          let curArr = currentMsgInfo.plateNumber.split('')
          let preArr = preMsgInfo.plateNumber.split('')
          curArr.forEach((item, index) => {
            // 计算不相同的位数
            if (item != preArr[index]) {
              count++
            }
          })
          // 如果不相同的位数过大，那么就不提示了
          if (count <= Configs.maxDiffCount) {
            console.log(11, localStorage.getItem('timeInterval'))
            window.electron.ipcRenderer.send(
              'warning',
              tempObj,
              localStorage.getItem('timeInterval')
            )
          }
        }
        // 识别成功初始化定时器
        this.createTimer()
      } else {
        // 识别成功或第一次收到消息，都初始化定时器
        this.createTimer()
        // 第一次接收，开启定时器，缓存消息
        this.preMsgCache = msg
      }
    }
  }
  // 开启定时器
  createTimer() {
    const Configs = {
      isJudgeDeviceCode: localStorage.getItem('isJudgeDeviceCode') || '1', //控制是否根据设备不同才记录消息
      judgeInterval: Number(localStorage.getItem('judgeInterval') || 1.5) || 1.5 //设置两次消息判断为一组消息的时间间隔
    }
    clearTimeout(this.timer)
    this.timer = null
    this.preMsgCache = null
    this.timer = setTimeout(() => {
      clearTimeout(this.timer)
      this.timer = null
      this.preMsgCache = null
    }, Configs.judgeInterval * 1000)
  }
}

const ins = new Msghandler()

export default ins
